269. PVC backup and restore
WHY
又來個問題,PVC有辦法備份嗎?
本來是想用第二個掛載volume的方式,
將資料備份出來,但GKE的volume只支援ReadWriteOnce。
Note
Step 1. 檢查有沒有支援 volumesnapshot
kubectl api-resources | grep volumesnapshot
有的話,應該會看到類似這樣的訊息
Step 2. 確認要備份pvc的CSI driver
顯示全部的CSI driver
kubectl get csidrivers
根據storageclass查詢(Provisioner欄位)
kubectl get sc -o wide
查pv的CSI driver(CSI.driver欄位)
kubectl get pv <volume-name> -o yaml
Step 3. 建立VolumeSnapshotClass
kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
metadata:
name: volume-snapshot-class
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
driver: pd.csi.storage.gke.io
deletionPolicy: Delete
建完後,使用下面指令查看
kubectl get vsclass
p.s. 可用 kubectl api-resources
查詢縮寫
Step 4. 建立VolumeSnapshot
指定要備份的pvc
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
name: postgres-snapshot
namespace: database
spec:
volumeSnapshotClassName: volume-snapshot-class # change your vsclass
source:
persistentVolumeClaimName: postgres-pvc # change your pvc
建完後使用下面指令查看
kubectl get volumesnapshots -n database
原本是可以直接使用vs作為縮寫代替,
但跟我的virtualservice衝突。
VolumeSnapshot執行完後,會自動建立一個VolumeSnapshotContent。
kc get vsc -n database
Step 5. 還原
建立一個pvc使用dataSource的方式還原,
底下的 storageClassName、dataSource.name 根據情況修改。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restore-pvc
namespace: database
spec:
storageClassName: standard-rwo
dataSource:
name: postgres-snapshot
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
單純執行建立pvc時,如出現錯誤
waiting for first consumer to be created before binding
這是由於storageClass的volumeBindingMode是 WaitForFirstConsumer
所以需要將deploy與pvc綁定,才能創建PV。
但這個只能備份一次,
還必須手動,
所以要全自動的話,
再看看要怎麼搞了。
ref.